/**
 * 
 */
package com.nari.heatshare.dao;

import java.util.Date;
import java.util.List;

import com.nari.coreframe.dao.hibernate3.IGenericDao;
import com.nari.heatshare.model.IAssignMeterDataGather;
import com.nari.platform.model.PageCond;
import com.nari.platform.model.ResponseMsg;
import com.nari.platform.model.ResultWithPageCond;
import com.sohoometer.web.bean.AssignDataWithInfo;

/**
 * 
 * @author Xiaopeng
 * @date 2013-8-18
 */
public interface IAssignMeterDataGatherDao extends IGenericDao<IAssignMeterDataGather, String> {

	/**
	 * 分页查询分配表数据列表
	 * @param concentratorNo 集中器号(可选)
	 * @param startDate 起始抄表时间(可选)
	 * @param endDate 终止抄表时间(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-2
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataPage(
			String concentratorNo, Date startDate, Date endDate,
			PageCond pageCond) throws Exception;
	
	/**
	 * 根据分配表表号、上传时间查询分配表数据列表
	 * @param seriousNum 分配表表号(必填)
	 * @param readTime 上传时间(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-23
	 */
	public List<IAssignMeterDataGather> queryMeterDatasByCond(String seriousNum, 
			Date readTime) throws Exception;
	
	/**
	 * 根据分配表表号、上传时间统计分配表数据个数
	 * @param seriousNum 分配表表号(必填)
	 * @param readTime 上传时间(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-23
	 */
	public long countMeterDataByCond(String seriousNum, Date readTime) throws Exception;
	
	/**
	 * 新增或修改分配表数据
	 * @param meterData
	 * 说明：新增分配表数据时，若表号相同、上传时间相同，则认为是重复数据，不予保存数据
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-25
	 */
	public ResponseMsg saveOrUpdateMeterData(IAssignMeterDataGather meterData) throws Exception;

	/**
	 * 批量新增或修改分配表数据
	 * @param meterDataList
	 * 说明：新增分配表数据时，若表号相同、上传时间相同，则认为是重复数据，不予保存数据
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-25
	 */
	public ResponseMsg saveOrUpdateMeterDataBatch(List<IAssignMeterDataGather> meterDataList) throws Exception;
	
	/**
	 * 统计某个分摊域下对应某个上传日期的分配表数据上传率(百分比%)
	 * @param shareAreaUID 分摊域(必填)
	 * @param readTime 上传日期(必填)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-25
	 */
	public double calcUploadPercentByShareArea(String shareAreaUID, 
			Date readTime) throws Exception;
	
	/**
	 * 统计某个集中器下对应某个上传日期的分配表数据上传率(百分比%)
	 * @param concentratorNo 集中器号(必填)
	 * @param readTime 上传日期(必填)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-25
	 */
	public double calcUploadPercentByConcentrator(String concentratorNo, 
			Date readTime) throws Exception;
	
	/**
	 * 根据分摊域分页查询所属分配表数据
	 * @param shareAreaUID 分摊域唯一标识(必须)
	 * @param seriousNum 分配表表号(可选)
	 * @param readTime 上传时间(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-1
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataPageByAreaUID(String shareAreaUID, 
			String seriousNum, Date readTime, PageCond pageCond) throws Exception;
	
	/**
	 * 根据分配表ID、上传日期查询分配表数据列表
	 * @param assignMeterUID 分配表ID(必填)
	 * @param readTime 上传日期(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-23
	 */
	public List<IAssignMeterDataGather> queryMeterDatasByMeterUID(String assignMeterUID, 
			Date readTime) throws Exception;
	
	/**
	 * 根据分配表ID查询对应的散热器权重
	 * @param assignMeterUID 分配表ID
	 * @param reviseFactor 热用户户修正系数，即散热器位置修正系数
	 * @param startReadTime 上传日期起始日期
	 * @param endReadTime 上传日期结束日期
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public double calcSinkWeightByAssignMeterUID(String assignMeterUID, double reviseFactor, 
			Date startReadTime, Date endReadTime) throws Exception;
	
	/**
	 * 通过热用户唯一标识查询散热器户权重
	 * @param heatRoomUID 热用户唯一标识
	 * @param startReadTime 上传日期起始日期
	 * @param endReadTime 上传日期结束日期
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public double calcSinkWeightByRoomUID(String heatRoomUID, Date startReadTime, 
			Date endReadTime) throws Exception;
	
	/**
	 * 根据分配表表表号、上传日期查询历史数据
	 * @param seriousNum 分配表表号
	 * @param readTime 上传日期
	 * @param dataLimit 取回历史数据的条数，若不限制，则取回所有历史数据
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-14
	 */
	public List<IAssignMeterDataGather> queryHistoryMeterData(String seriousNum, 
			Date readTime, Integer dataLimit) throws Exception;
	
	/**
	 * 新增分配表表平滑数据(包括人工干预数据和系统自动平滑数据)
	 * @param seriousNum 分配表表号
	 * @param readTime 上传时间
	 * @param readNum 分配表读数
	 * @param backTmperature 背板温度
	 * @param fontTemperature 前板温度
	 * @return 返回平滑数据的ID
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-15
	 */
	public String saveTransitionMeterData(String seriousNum, Date readTime, 
			double readNum, double backTmperature, double fontTemperature) throws Exception;
	
	/**
	 * 通过集中器上传批次任务(集中器号、抄表日期)分页查询分配表数据
	 * @param concentratorNo 任务批次上传的集中器号
	 * @param recordTime 任务批次上传的抄表日期
	 * @param seriousNum 分配表表号(可选)
	 * @param startDate 上传日期起始日期(可选)
	 * @param endDate 上传日期结束日期(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-25
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataPageByUploadBatch(String concentratorNo, 
			Date recordTime, String seriousNum, Date startDate, Date endDate, 
			PageCond pageCond) throws Exception;
	
	/**
	 * 通过数据文件ID删除TXT上传的分配表数据
	 * @param dataFileUID
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-29
	 */
	public void deleteMeterDataByFileID(String dataFileUID) throws Exception;
	
	/**
	 * 通过TXT上传的文件ID分页查询分配表数据
	 * @param dataFileUID TXT文件ID(必选)
	 * @param seriousNum 分配表号
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-29
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataPageByFileID(String dataFileUID, 
			String seriousNum, PageCond pageCond) throws Exception;
	
	/**
	 * 批次删除某次任务上传数据
	 * @param concentratorNo 集中器号(任务批次标识一)
	 * @param recordTime 抄表日期(任务批次标识二)
	 * @param dataTypes 上传的数据类型,若未说明,则删除所有类型的数据
	 * 0:平滑数据	1:txt上传解析数据	2:定点上传数据
	 * 3:掌机上传数据	空或其他:未知来源数据
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-12-2
	 */
	public void deleteMeterDataUploadBatch(String concentratorNo, Date recordTime, 
			Integer... dataTypes) throws Exception;
	
//	/**
//	 * 根据相关任务批次、及分配表档案资料查询分配表数据的成功上传数
//	 * @param concentratorNo
//	 * @param recordTime
//	 * @param dataType
//	 * @return
//	 * @throws Exception
//	 * @author Xiaopeng
//	 * @date 2014-4-2
//	 */
//	public int queryUploadNumByReferBatch(String concentratorNo, Date recordTime, 
//			Integer dataType) throws Exception;
	
	/**
	 * 查询缺少基础档案信息的分配表数据对应的表号
	 * @param concentratorNo
	 * @param recordTime
	 * @param dataType
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-2
	 */
	public List<String> queryLackBaseinfoSeriousNum(String concentratorNo, Date recordTime, 
			Integer dataType) throws Exception;
	
	/**
	 * 根据任务批次信息查询分配表数据列表
	 * @param concentratorNo
	 * @param recordTime
	 * @param dataType
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-2
	 */
	public List<IAssignMeterDataGather> queryMeterDatasByBatch(String concentratorNo, 
			Date recordTime, Integer dataType) throws Exception;
	
	/**
	 * 根据定制查询特征信息(所属楼栋、抄表时间)统计分配表列表数据个数
	 * @param buildingUID
	 * @param recordTime
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-10
	 */
	public int countCustomizedAmDataList(String buildingUID, Date recordTime) throws Exception;
	
	/**
	 * 根据定制查询特征信息(所属楼栋、抄表时间)查询分配表数据列表
	 * @param buildingUID
	 * @param recordTime
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-14
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryCustomizedAmDataList(String buildingUID, 
			Date recordTime, PageCond pageCond) throws Exception;
	
	/**
	 * 查询一个批次数据的上传时间，上传时间取最大值
	 * @param concentratorNo
	 * @param recordTime
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-27
	 */
	public Date queryReadTime4BatchUpload(String concentratorNo, Date recordTime) throws Exception;
	
	/**
	 * 根据上传批次特征信息统计分配表数据的个数
	 * @param concentratorNo
	 * @param recordTime
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2015-1-8
	 */
	public int countMeterDataNumByUploadBatch(String concentratorNo, Date recordTime) throws Exception;

	public  ResultWithPageCond<AssignDataWithInfo> queryAssignDataWithInfo(String buildingUID, Date recordTime,
			PageCond pageCond) throws Exception;

	public abstract List<IAssignMeterDataGather> queryAssignMeterData(String  seriousNum, Date startDate,
			Date endDate) throws Exception;

	public abstract Date queryLastUploadDate(String  meterNo) throws Exception;

	public abstract List<IAssignMeterDataGather> queryAssignMeterDataWithLimit(String  seriousNum,
			Date startDate, Date endDate, int limit) throws Exception;
	
	
	
	
	
	
	
	/**
	 * 根据分配表号 分页查询分配表数据
	 * 
	 * @param seriousNum 分配表号
	 * @param startDate 起始抄表时间
	 * @param endDate 终止抄表时间
	 * @param pageCond
	 * @return
	 * @throws Exception
	 */
	public ResultWithPageCond<IAssignMeterDataGather> queryMeterDataAllotPage(String seriousNum, 
			Date startDate, Date endDate, PageCond pageCond) throws Exception;

	/**
	 * 根据分配表表号、上传时间查询分配表数据列表
	 * @param seriousNum 分配表表号(必填)
	 * @param readTime 上传时间(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-23
	 */
	public List<IAssignMeterDataGather> queryMeterDatasBySeriousNumList(String seriousNum, 
			Date recordTime) throws Exception;

	
}
